#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

//面向对象的三大特性:封装、继承、多态




//一、封装
//封装的意义：	1.将属性和行为作为一个整体，表现事物
//				2.将属性和行为加以权限控制

////案例1：设计一个圆类，求圆的周长
//const double PI = 3.14; //圆周率
//class Circle
//{
//	//访问权限
//public:    //公共权限
//
//	//属性（成员变量，成员属性）
//	int r;
//
//	//行为(成员函数，成员方法) 
//	double C()
//	{
//		return 2 * PI * r;
//	}
//
//	double S()
//	{
//		return PI * r * r;
//	}
//};
////类中的属性和行为统称成员
//
////练习1：设计一个学生类
//class Student
//{
//public:
//
//	string num;
//	string name;
//
//	void setname(string m_name1)
//	{
//		name = m_name1;
//	}
//
//	void setnum(string m_num1)
//	{
//		num = m_num1;
//	}
//
//	void DispStu()
//	{
//		cout << "姓名: " << name << "\t" << "学号: " << num << endl;
//	}
//};
//
//int main()
//{
//	//案例1
//	////创建对象
//	//Circle c1;
//
//	////属性赋值
//	//c1.r = 10;
//
//	//cout << "圆的周长为:" << c1.C() << endl;
//	//cout << "圆的面积为:" << c1.S() << endl;
//
//
//	//练习1
//	Student stu1;
//	stu1.name = "李四";
//	stu1.setname("张三");
//	stu1.num = "202201001";
//	stu1.setnum("202201002");
//	stu1.DispStu();
//
//	return 0;
//}




////类在设计时，可以把成员放在不同的权限下，加以控制
////权限访问有三种：
//// 1.public 公共权限		成员在类内可以访问，类外可以访问
//// 2.protected 保护权限		成员在类内可以访问，类外不可以访问	子类可以访问父类的成员
//// 3.private 私有权限		成员在类内可以访问，类外不可以访问	子类不可以访问父类的成员
//
////class 和 struct 都可以创建类，但创建类时默认的访问权限不同，
////class默认是private， struct默认是public
//
//class Person
//{
//public: //公共权限
//	string name;
//
//protected: //保护权限
//	string car;
//
//private: //私有权限 
//	int password;
//
//public:
//	void func()
//	{
//		//类内均可以访问
//		name = "张三";
//		car = "轿车";
//		password = 123456;
//		cout << "name: " << name << endl;
//		cout << "car: " << car << endl;
//		cout << "password: " << password << endl;
//	}
//};
//int main()
//{
//	Person p1;
//	p1.name = "李四";
//	//p1.car = "拖拉机";
//	//p1.Password = 123321;  //类外不能访问，会报错
//	p1.func();  //func的权限为public 可以访问，
//}
//



////成员属性设置为私有
////1.可以控制读写权限  2.可以检测数据的有效性
//
//class Person
//{
//
//private:
//	string m_name;  //要求可读可写
//
//	int m_age = 18;		//要求只读（如果要写只能在0-120）
//
//	string m_idol;	//要求只写
//
//public:
//	//姓名可写
//	void setName(string name)
//	{
//		m_name = name;
//	}
//	//姓名可读
//	void getName()
//	{
//		cout << "姓名: " << m_name << endl;
//	}
//	//年龄可读
//	void getAge()
//	{
//		cout << "年龄: " << m_age << endl;
//	}
//	//偶像可写
//	void setIdol(string idol)
//	{
//		m_idol = idol;
//	}
//	//写年龄
//	int setAge(int age)
//	{
//		if (age < 0 || age > 120)
//		{
//			cout << "输入错误，赋值失败。" << endl;
//			return  0;
//		}
//		m_age = age;
//		return 0;
//	}
//};
//
//int main()
//{
//	Person p1;
//	p1.setName("张三");
//	p1.getName();
//	p1.getAge();
//	p1.setIdol("林俊杰");
//	p1.setAge(130);
//}


//
////封装案例1: 设计立方体类
////求出立方体的面积和体积
////分别用全局函数和成员函数判断两个立方体是否相等
//
//class Cube
//{
//private:
//	int m_L;
//	int m_W;
//	int m_H;
//
//public:
//	void setLength(int length)
//	{
//		m_L = length;
//	}
//	void setWidth(int width)
//	{
//		m_W = width;
//	}
//	void setHigth(int higth)
//	{
//		m_H = higth;
//	}
//	int getLength()
//	{
//		return m_L;
//	}
//	int getWidth()
//	{
//		return m_W;
//	}
//	int getHigth()
//	{
//		return m_H;
//	}
//	int getArea()
//	{
//		int S = 2 * (m_H * m_L + m_H * m_W + m_L * m_W);
//		return S;
//	}
//	int getVolume()
//	{
//		int V = m_H * m_W * m_L;
//		return V;
//	}
//
//	bool isSame2(Cube &c)
//	{
//		if (m_H == c.getHigth() && m_L == c.getLength() && m_W == c.getWidth())
//			return 1;
//		else
//			return 0;
//	}
//};
//
////全局函数
//bool isSame1(Cube& c1, Cube& c2)
//{
//	if (c1.getHigth() == c2.getHigth() && c1.getLength() == c2.getLength() && c1.getWidth() == c2.getWidth())
//		return 1;
//	else
//		return 0;
//}
//
//int main()
//{
//	Cube c1;
//	c1.setHigth(10);
//	c1.setLength(10);
//	c1.setWidth(10);
//	cout << "c1的面积为: " << c1.getArea() << endl;
//	cout << "c1的体积为: " << c1.getVolume() << endl;
//
//	Cube c2;
//	c2.setHigth(10);
//	c2.setLength(10);
//	c2.setWidth(11);
//
//	if (isSame1(c1, c2))
//	{
//		cout << "c1和c2是相等的。" << endl;
//	}
//	else
//	{
//		cout << "c1和c2是不相等的。" << endl;
//	}
//
//
//	if (c1.isSame2(c2))
//	{
//		cout << "c1和c2是相等的。" << endl;
//	}
//	else
//	{
//		cout << "c1和c2是不相等的。" << endl;
//	}
//
//
//	return 0;
//}



//封装案例2: 点和圆的关系
//设计一个圆形类（Circle），和一个点类（point），计算点和元的关系

class Point
{
private:
	int m_x;
	int m_y;

public:
	void setX(int x)
	{
		m_x = x;
	}
	int getX()
	{
		return m_x;
	}
	void setY(int y)
	{
		m_y = y;
	}
	int getY()
	{
		return m_y;
	}
};

class Circle
{
private:
	int m_r;
	Point m_Center;

public:
	void setR(int r)
	{
		m_r = r;
	}
	int getR()
	{
		return m_r;
	}
	void setCenter(Point center)
	{
		m_Center = center;
	}
	Point getCenter()
	{
		return m_Center;
	}
};


//判断点和圆的关系函数
void isInCircle(Circle& c, Point p)
{
	int n1 = (p.getX() - c.getCenter().getX()) * (p.getX() - c.getCenter().getX()) + (p.getY() - c.getCenter().getY()) * (p.getY() - c.getCenter().getY());
	int n2 = c.getR() * c.getR();
	if (n1 == n2)
	{
		cout << "点在圆上。" << endl;
	}
	else if (n1 > n2)
	{
		cout << "点在圆外。" << endl;
	}
	else
	{
		cout << "点在圆内。" << endl;
	}

}

int main()
{
	//创建圆
	Circle c;
	c.setR(10);
	Point center;
	center.setX(10);
	center.setY(0);
	c.setCenter(center);

	//创建点
	Point p;
	p.setX(10);
	p.setY(10);

	isInCircle(c, p);

}
//在类中可以让另一个类作为本类的成员



